
#include <iostream>
#include "TDD.h"

#include "..\PakEngine\PakEngine.cpp"
#include "..\PakEngine\RenderList.cpp"
#include "..\PakEngine\Render.cpp"
#include "..\PakEngine\SpriteList.cpp"
#include "..\PakEngine\KeyBoard.cpp"
#include "..\PakEngine\Physics.cpp"
#include "..\PakEngine\DrawObject.h"
#include "..\PakEngine\DrawObject.cpp"
#include "..\PakEngine\RenderObject.h"
#include "..\PakEngine\TextObject.h"
#include "..\PakEngine\TextObject.cpp"
#include "..\PakEngine\glQuickText.cpp"

void TestRender(void)
{
	std::cout << "Testeo de Render" << std::endl;

	PAKENGINE_DrawGraf(0,0,0, 0);
	TDD_Assert("No introduce bien 1 tarea de pintado",RENDERLIST_GetNumber() == 1);

	PAKENGINE_Render();
	TDD_Assert("No limpia bien 1 tarea de pintado",RENDERLIST_GetNumber() == 0);

	PAKENGINE_DrawGraf(0,0,0, 0);
	PAKENGINE_DrawGraf(0,0,0, 0);
	PAKENGINE_DrawGraf(0,0,0, 0);
	TDD_Assert("No introduce bien 3 tareas de pintado",RENDERLIST_GetNumber() == 3);

	PAKENGINE_Render();
	TDD_Assert("No limpia bien 3 tareas de pintado",RENDERLIST_GetNumber() == 0);

	PAKENGINE_DrawGraf(0,0,0, 0);
	PAKENGINE_DrawGraf(0,0,25, 0);
	PAKENGINE_DrawGraf(0,0,50, 0);
	TDD_Assert("No ordena bien 3 z's inversamente ordenadas", RENDERLIST_Check() );
	
	PAKENGINE_Render();
	TDD_Assert("No limpia bien 3 tareas de pintado inversamente ordenadas",RENDERLIST_GetNumber() == 0);

	
	PAKENGINE_DrawGraf(0,0,50, 0);
	PAKENGINE_DrawGraf(0,0,25, 0);
	PAKENGINE_DrawGraf(0,0,0, 0);
	TDD_Assert("No ordena bien 3 z's ordenadas", RENDERLIST_Check() );

	PAKENGINE_Render();
	TDD_Assert("No limpia bien 3 tareas de pintado ordenadas",RENDERLIST_GetNumber() == 0);

	
	PAKENGINE_DrawGraf(0,0,25, 0);
	PAKENGINE_DrawGraf(0,0,50, 0);
	PAKENGINE_DrawGraf(0,0,0, 0);
	TDD_Assert("No ordena bien 3 z's desordenadas", RENDERLIST_Check() );

	PAKENGINE_Render();
	TDD_Assert("No limpia bien 3 tareas de pintado desordenadas",RENDERLIST_GetNumber() == 0);
}

void TestRenderList(void)
{
	RenderObject *p = 0;

	std::cout << "Testeo de Render List" << std::endl;
	
	PAKENGINE_DrawGraf(0,0,50, 0);
	PAKENGINE_DrawGraf(0,0,25, 0);
	PAKENGINE_DrawGraf(0,0,0, 0);

	RENDERLIST_GetFirstElement(&p);
	TDD_Assert("No selecciona bien el primer elemento de pintado(NULL)",p != 0);
	TDD_Assert("No selecciona bien el primer elemento de pintado(ordenamiento)",p->z == 50);

	RENDERLIST_GetNextElement(&p);
	TDD_Assert("No selecciona bien el segundo elemento de pintado(NULL)",p != 0);
	TDD_Assert("No selecciona bien el segundo elemento de pintado(ordenamiento)",p->z == 25);

	RENDERLIST_GetNextElement(&p);
	TDD_Assert("No selecciona bien el tercer elemento de pintado(NULL)",p != 0);
	TDD_Assert("No selecciona bien el tercer elemento de pintado(ordenamiento)",p->z == 0);

	RENDERLIST_GetNextElement(&p);
	TDD_Assert("No selecciona bien el final de elementos de pintado(NULL)",p == 0);

	RENDERLIST_Clear();
}

void TestCollision(int graf1, int graf2 )
{

	std::cout << "Testeo de Colisiones" << std::endl;

	TDD_Assert("No deberia dar colision si los dos objetos estan alejados en x", !PAKENGINE_Collision(80,100,graf1, 110,90, graf2) );
	
	TDD_Assert("No deberia dar colision si los dos objetos estan alejados en x(2)", !PAKENGINE_Collision(150,100,graf1, 110,90, graf2) );

	TDD_Assert("No deberia dar colision si los dos objetos estan a diferente altura", !PAKENGINE_Collision(100,10,graf1, 110,90, graf2) );

	TDD_Assert("No deberia dar colision si los dos objetos estan a diferente altura(2)", !PAKENGINE_Collision(100,100,graf1, 110,10, graf2) );

	TDD_Assert("Deberia dar colision por la derecha",(  PAKENGINE_Collision(100,100,graf1, 110,90, graf2, "right") ));

	TDD_Assert("Deberia dar colision por la izquierda",( PAKENGINE_Collision(110,90,graf2, 100,100, graf1, "left") ));

	TDD_Assert("Deberia dar colision por arriba",( PAKENGINE_Collision(100,100,graf1, 100,79, graf2, "up") ));

	TDD_Assert("Deberia dar colision por abajo",( PAKENGINE_Collision(100,81,graf1, 100,100, graf2, "down") ));
}

void TestInclusion(int graf1, int graf2 )
{
	std::cout << "Testeo de Inclusiones" << std::endl;

	TDD_Assert("Deberia decirnos que un objeto esta dentro del otro", !PAKENGINE_NotInside ( 100,100,graf1, 0,0, graf2 )  );

	TDD_Assert("Deberia decirnos que un objeto NO esta dentro del otro", PAKENGINE_NotInside ( 1000,1000,graf1, 0,0, graf2 )  );

	TDD_Assert("Deberia decirnos que un objeto sale por la derecha", PAKENGINE_NotInside ( 630,100,graf1, 0,0, graf2 ,"right")  );
	
	TDD_Assert("Deberia decirnos que un objeto sale por la izquierda", PAKENGINE_NotInside ( -10,100,graf1, 0,0, graf2, "left" )  );

	TDD_Assert("Deberia decirnos que un objeto sale por abajo", PAKENGINE_NotInside ( 100,470,graf1, 0,0, graf2 , "down" )  );

	TDD_Assert("Deberia decirnos que un objeto sale por arriba", PAKENGINE_NotInside ( 100,-1,graf1, 0,0, graf2 ,"up")  );
}

void TestPhysics(void)
{
	int bola,pala,campo;

	std::cout << "Testeo de Fisicas" << std::endl;
	
	bola  = PAKENGINE_LoadGraph("Resources\\test_bola.png");
	pala  = PAKENGINE_LoadGraph("Resources\\test_pala.png");
	campo = PAKENGINE_LoadGraph("Resources\\test_campo.png");

	TestCollision(bola,pala);
	TestInclusion(bola,campo);
}

void AllTest(void)
{
	std::cout << "Iniciando pruebas TDD" << std::endl;

	TestRender();
	TestRenderList();
	TestPhysics();

	PrintSummary();
}

int main(void)
{	
  AllTest();

  return 0;

}